package com.amado.course34Thread;

import java.util.HashMap;
import java.util.Map;

/**
 * ThreadLocal的实例代表了一个线程局部的变量，每条线程都只能看到自己的值，并不会意识到其它的线程中也存在该变量。
 * 对于同一个static ThreadLocal，不同线程只能从中get，set，remove自己的变量，而不会影响其他线程的变量。
 * ThreadLocal类中维护一个Map，用于存储每一个线程的变量副本，Map中元素的键为线程对象，而值为对应线程的变量副本
 * @author Administrator
 *
 *
 *有时方法调用链很长，a -()->b()->c()->d()->e()->()->...g(),怎么在a方法把参数传递到e方法
 *有时方法调用链很长，a synchroized -()->b()->c()->d()->e()->()->...g(),怎么在a方法把参数传递到e方法
 *
 *
 *共享变量？
 *
 *a线程  共享变量值  String totalValue="main-value";
 *b线程  共享变量值  String totalValue="0-value";
 *
 *a进入g()方法取值totalValue = "0-value"
 */
public class S11ThreadLocal {
	//什么数据类型都可以，根据ThreadLocal<?>
	static  ThreadLocal<String>  threadLocal = new ThreadLocal<>();
	static  Map<String,String>  map = new HashMap<String,String>();
	public static void main(String[] args) {
		//主线程
		threadLocal.set("李四");
		//多线程会覆盖
		map.put("name", "小王");
		a("张三");
		
//		//new 一个线程
//		new Thread(()->{
//			threadLocal.set("0-value");
//			a("李四");
//		}).start();
	}
	/**
	 * 打印线程中的值
	 */
	public static void a(String name) {
		b(name);
	}
	/**
	 * 打印线程中的值
	 */
	public static void b(String name) {
		c(name);
	}
	/**
	 * 打印线程中的值
	 */
	public static void c(String name) {
		d(name);
	}
	/**
	 * 打印线程中的值
	 */
	public static void d(String name) {
		System.out.println(name);
		System.out.println(threadLocal.get());
		System.out.println(map.get("name"));
		
	}

}
